package control;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import entity.Utente;
import exception.LoginException;
import remote.AutenticazioneRemote;
import util.LoginToken;
import util.LoginToken.TipoAccesso;
import util.MD5Encrypter;

public @Stateless(name = "Autenticazione")
class Autenticazione implements AutenticazioneRemote {
	public static final String USERNAME_AMMINISTRATORE = "admin";
	public static final String PASSWORD_AMMINISTRATORE = "admin";
	@PersistenceContext(unitName = "swim")
	private EntityManager entityManager;

	/**
	 * Fornisce il token di autenticazione, se trova l'utente corrispondente
	 * all'username e la password inserite.
	 */
	// @Override
	public LoginToken autenticazione(String username, String password)
			throws LoginException {
		LoginToken loginToken = null;
		long session = 2;
		if (username == null || password == null || username.length() == 0
				|| password.length() == 0)
			throw new LoginException("Username e/o password non inserite");

		if (entityManager.find(Utente.class, username.toLowerCase()) != null) {
			Utente utente = entityManager.find(Utente.class,
					username.toLowerCase()); // NB: converto le maiuscole in
												// minuscole
			if (!MD5Encrypter.uguali(utente.getPassword(),
					MD5Encrypter.encrypt(password)))
				throw new LoginException("Password errata");
			loginToken = new LoginToken(utente.getUsername(), utente.getNome(),
					utente.getCognome(), session, TipoAccesso.Utente);
			return loginToken;
		}
		if (username.equals(USERNAME_AMMINISTRATORE)) {
			if (!password.equals(PASSWORD_AMMINISTRATORE))
				throw new LoginException("Password errata");
			loginToken = new LoginToken(USERNAME_AMMINISTRATORE, "Marco",
					"Tagliabue", session, TipoAccesso.Amministratore);
			return loginToken;
		}

		throw new LoginException("Username '" + username + "' non trovato");
	}

}
